package dao

import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOptions.Builder.*

import static util.DaoUtil.*

import hatenahaiku4j.util.*

/**
 * クロール情報に関するDAO
 */
class CrawlInfoDao {

	//------------------------------------------------
	// Constants

	/** このDAOで扱うKIND */
	static final String KIND = 'CrawlInfo'

	//------------------------------------------------
	// Property of this class

	/** クロールID */
	String crawlId
	/** データストアサービス */
	DatastoreService datastoreService

	//------------------------------------------------
	// Key of field

	// 次に使うSINCE
	static final String SINCE = 'since'
	// 次にクロールするPAGE
	static final String PAGE = 'page'
	// 更新日時
	static final String UPDATED_AT = 'updatedAt'

	//------------------------------------------------
	// Constructor

	/**
	 * コンストラクタ
	 * @param crawlId クロールID
	 */
	CrawlInfoDao(String crawlId) {
		this.crawlId = crawlId
		this.datastoreService = DatastoreServiceFactory.getDatastoreService()
	}

	//------------------------------------------------
	// Methods

	/**
	 * クロール情報取得
	 */
	def getCrawlInfo() {
		def q = new Query(KeyFactory.createKey(KIND, crawlId))
		def info = datastoreService.prepare(q).asSingleEntity()
		if (!info) {
			info = new Entity(KIND, crawlId)
			info.save()
		}
		setDefault(info)
		return info
	}

	/**
	 * ※暫定※
	 * toCrawlInfoして返す
	 */
	def getCrawlInfo2() {
		toCrawlInfo(getCrawlInfo())
	}
	
	//------------------------------------------------
	// Utilities

	/**
	　* 初期値を設定
	 */
	static def setDefault(def info) {
		def now = DateUtil.now
		if (!info[SINCE])
			info[SINCE]			= now
		if (!info[PAGE])
			info[PAGE]			= 1
		if (!info[UPDATED_AT])
			info[UPDATED_AT]	= now
	}

}
